home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / bbs / mxgui203.zip / MAXUNITG.PAS < prev    next >
Pascal/Delphi Source File  |  1997-08-14  |  40KB  |  1,212 lines

  1. {
  2. ───────────────────────────────────────────────────────────────────────────────
  3.   ▀▀▀   ▀▀▀   ▀▀▀▀▀   ▀▀   ▀▀
  4.   ▀▀▀▀ ▀▀▀▀  ▀▀   ▀▀   ▀▀ ▀▀
  5.   ▀▀ ▀▀▀ ▀▀  ▀▀▀▀▀▀▀    ▀▀▀    ╔══ ╦═╗ ╔═╗ ╦═╗ ╦ ╦ ╦ ╔═╗ ╔═╗
  6.   ▀▀  ▀  ▀▀  ▀▀   ▀▀   ▀▀ ▀▀   ║ ╦ ╠╦╝ ╠═╣ ╠═╝ ╠═╣ ║ ║   ╚═╗
  7.   ▀▀     ▀▀  ▀▀   ▀▀  ▀▀   ▀▀  ╚═╝ ╩╚═ ╩ ╩ ╩   ╩ ╩ ╩ ╚═╝ ╚═╝
  8. ───────────────────────────────────────────────────────────────────────────────
  9.   The MAX Graphics GUI Kit is Copyright 1995-Current Larry L. Athey (LA-Soft).
  10.   Color Averaging procedures are courtesy of Sean Price (Rude Dog Software).
  11. ───────────────────────────────────────────────────────────────────────────────  }
  12. {$A+,B-,D+,E+,F+,G+,I-,L+,N-,O+,P-,Q-,R-,S-,T-,V+,X+}
  13. UNIT MAXUNITG;
  14.  
  15. INTERFACE
  16.  
  17. USES DOS, TDK_VARS;
  18.  
  19. CONST
  20.   Carrier     : BOOLEAN = TRUE;  {Replaces the DOORKIT1/FUNCTION Carrier    }
  21.   InitComport : BOOLEAN = TRUE;  {Replaces the DOORKIT1/FUNCTION InitComport}
  22.   MaxMode     : BOOLEAN = TRUE;  {Are we in MAX mode or ANSI mode?          }
  23.   GuiInit     : BOOLEAN = FALSE; {Has the GUI been initialized?             }
  24.  
  25. {──MAX_UNIT Dummy Routines──────────────────────────────────────────────────}
  26. PROCEDURE MaxCommand(S : STRING);
  27. {──DOORKIT1 Dummy Routines──────────────────────────────────────────────────}
  28. PROCEDURE InitDoorKit;
  29. PROCEDURE ReadCTL;
  30. PROCEDURE StartUpLog;
  31. PROCEDURE ClockOn;
  32. PROCEDURE ClockOff;
  33. PROCEDURE UpdateTime;
  34. PROCEDURE DeInitComport;
  35. FUNCTION  GetChar : CHAR;
  36. PROCEDURE Lower_DTR;
  37. FUNCTION  DataAvailable : BOOLEAN;
  38. PROCEDURE SendStr(S : STRING);
  39. PROCEDURE sCursorUp(N : BYTE);
  40. PROCEDURE sCursorDown(N : BYTE);
  41. PROCEDURE sCursorLeft(N : BYTE);
  42. PROCEDURE sCursorRight(N : BYTE);
  43. PROCEDURE sClrScr;
  44. PROCEDURE sClrEol;
  45. PROCEDURE sGotoXY(X,Y : BYTE);
  46. PROCEDURE FlushOutput;
  47. PROCEDURE PurgeOutPut;
  48. PROCEDURE PurgeInput;
  49. PROCEDURE sWriteC(C : CHAR);
  50. PROCEDURE sWrite(S : STRING);
  51. PROCEDURE sWriteln(S : STRING);
  52. FUNCTION  sKeyPressed : BOOLEAN;
  53. PROCEDURE sWaitInput(Ms : INTEGER);
  54. FUNCTION  sReadKey : CHAR;
  55. FUNCTION  AnsiColor : STRING;
  56. PROCEDURE SetFore(Fore : BYTE);
  57. PROCEDURE SetBack(Back : BYTE);
  58. PROCEDURE Set_Color(Fore,Back : BYTE);
  59. PROCEDURE ShowStatusBar;
  60. PROCEDURE HideStatusBar;
  61. PROCEDURE AutoDetect;
  62. PROCEDURE FakeVirus;
  63. PROCEDURE ReadDorInfo(DoorFn : PathStr; VAR DropInfo : tDoor);
  64. PROCEDURE ReadDoorSys(DoorFn : PathStr; VAR DropInfo : tDoor);
  65. PROCEDURE ReadMxUserDat(DoorFn : PathStr; VAR DropInfo : tDoor);
  66. PROCEDURE CommandLineHelp;
  67. {──DOORKIT3 Dummy Routines──────────────────────────────────────────────────}
  68. PROCEDURE ShowProgramAd;
  69. PROCEDURE CPrompt(HotKey : CHAR ; Txt : STRING);
  70. PROCEDURE MenuKey(X,Y : BYTE ; HotKey : CHAR ; Txt : STRING);
  71. PROCEDURE YesNoBox;
  72. PROCEDURE FancyPrompt;
  73. PROCEDURE Select;
  74. PROCEDURE YnPrompt(Txt : STRING);
  75. PROCEDURE NyPrompt(Txt : STRING);
  76. PROCEDURE AnyKey;
  77. PROCEDURE OutTxt(FG,BG : BYTE ; Txt : STRING);
  78. PROCEDURE OutTxtL(FG,BG : BYTE ; Txt : STRING);
  79. PROCEDURE OutTxtXY(X,Y,FG,BG : BYTE ; Txt : STRING);
  80. PROCEDURE OutTxtXYL(X,Y,FG,BG : BYTE ; Txt : STRING);
  81. PROCEDURE LineBar(FG,BG,L : BYTE);
  82. FUNCTION  SecretInput(Len : BYTE; Default : STRING) : STRING;
  83. FUNCTION  NameInput(Len : BYTE; Default : STRING) : STRING;
  84. FUNCTION  NormalInput(Len : BYTE; Default : STRING) : STRING;
  85. FUNCTION  CapsInput(Len : BYTE; Default : STRING) : STRING;
  86. FUNCTION  NumberInput(Len : BYTE; Default : STRING) : STRING;
  87. FUNCTION  NamePrompt(StrLength : BYTE ; InStr : STRING) : STRING;
  88. FUNCTION  NormalPrompt(StrLength : BYTE ; InStr : STRING) : STRING;
  89. FUNCTION  NumberPrompt(StrLength : BYTE ; InStr : STRING) : STRING;
  90. FUNCTION  SecretPrompt(StrLength : BYTE ; InStr : STRING) : STRING;
  91. FUNCTION  CapsPrompt(StrLength : BYTE ; InStr : STRING) : STRING;
  92. FUNCTION  SysField(X,Y,Style,StrLength : BYTE ; InStr : STRING) : STRING;
  93. PROCEDURE DummyField(X,Y,StrLength : BYTE ; InStr : STRING);
  94. PROCEDURE DrawWin(X1,Y1,X2,Y2 : BYTE ; Title : STRING);
  95. PROCEDURE ClearWin(X1,Y1,X2,Y2 : BYTE);
  96. PROCEDURE DrawButton(HotKey : CHAR ; Txt : STRING ; HighLight : BOOLEAN);
  97. PROCEDURE SysButton(X,Y : BYTE ; HotKey : CHAR ; Txt : STRING);
  98. PROCEDURE DrawMenu(X1,Y1,X2,Y2 : BYTE);
  99. PROCEDURE MenuItem(X,Y : BYTE ; HotKey : CHAR ; Txt : STRING);
  100. PROCEDURE MenuLine(X,Y,L : BYTE);
  101. PROCEDURE MenuBarItem(X,Y : BYTE ; HotKey : CHAR ; Txt : STRING);
  102. PROCEDURE IceText(S : STRING ; LF : BOOLEAN);
  103. PROCEDURE InfoBox(Width : BYTE ; Height : BYTE);
  104. PROCEDURE InfoText(Txt : STRING);
  105. PROCEDURE RunEntryForm(ScriptFile : STRING);
  106. FUNCTION  StripColors(InStr : STRING) : STRING;
  107. PROCEDURE CvtColors(InStr : STRING ; LF : BOOLEAN);
  108. PROCEDURE RipToText;
  109. PROCEDURE ShowTextFile(TextFile : STRING);
  110. PROCEDURE ShowScreen(Scr : STRING);
  111. PROCEDURE nstText(S : STRING ; LF : BOOLEAN);
  112. PROCEDURE ChatSelect;
  113. PROCEDURE DVWrite(X,Y : WORD; Attr : BYTE; S : STRING);
  114. PROCEDURE AlertTones;
  115. {───────────────────────────────────────────────────────────────────────────}
  116.  
  117. IMPLEMENTATION
  118.  
  119. USES _EXIT, CRT, DOORKIT2, _SCRIPT, GUI_UTIL, GUI_UNIT, GUI_ANSI, FGMAIN;
  120.  
  121. {───────────────────────────────────────────────────────────────────────────}
  122. PROCEDURE MaxCommand(S : STRING);
  123. BEGIN
  124.   ScrStr := StripBoth(S,' ');
  125.   IF (POS(#12,ScrStr) > 0) OR (POS(' ~² ',ScrStr) > 0) OR (POS('START_SCREEN()',AllCaps(ScrStr)) > 0) THEN BEGIN
  126.     IF WindowNumber > 2 THEN REPEAT Kill_Window UNTIL WindowNumber = 2;
  127.     MaxMode := TRUE;
  128.     MouseOn := TRUE;
  129.     CheckControlLine(' ~² ');
  130.     EXIT;
  131.   END;
  132.   IF (TvPort.Active) AND (ScreenDone) THEN BEGIN
  133.     EraseCursor;
  134.     Display_ANSIstr(ScrStr);
  135.     PlaceCursor;
  136.     EXIT;
  137.   END;
  138.   IF POS(#255#125,ScrStr) = 1 THEN BEGIN
  139.     CheckColorCommand(ScrStr);
  140.     EXIT;
  141.   END;
  142.   IF POS(#255#126,ScrStr) = 1 THEN CheckControlLine(ScrStr) ELSE CheckScriptLine(ScrStr);
  143. END;
  144. {───────────────────────────────────────────────────────────────────────────}
  145. PROCEDURE InitDoorKit;
  146. PROCEDURE CheckResource(FName : STRING);
  147. BEGIN
  148.   IF FExist(FName) THEN EXIT;
  149.   TextAttr := 12;
  150.   WRITELN('CRITICAL ERROR!!!');
  151.   WRITELN('-----------------');
  152.   WRITELN('The resource file ' + FName);
  153.   WRITELN('cannot be found, program halting...');
  154.   WRITE(^G);
  155.   TextAttr := 7;
  156.   GOTOXY(1,24); WRITE('Press Almost Any Key To Continue...');
  157.   READKEY;
  158.   ErrLevel := 6;
  159.   HALT(ErrLevel);
  160. END;
  161. BEGIN
  162.   CLRSCR;
  163.   IF MEMAVAIL < 100000 THEN BEGIN
  164.     TextAttr := 12;
  165.     WRITELN('CRITICAL ERROR!!!');
  166.     WRITELN('-----------------');
  167.     WRITELN('Less than 100K of free conventional memory, program halting...');
  168.     WRITE(^G);
  169.     TextAttr := 7;
  170.     GOTOXY(1,24); WRITE('Press Almost Any Key To Continue...');
  171.     READKEY;
  172.     ErrLevel := 7;
  173.     HALT(ErrLevel);
  174.   END;
  175.   IF PARAMCOUNT <> 0 THEN SesPath := FixPath(AllCaps(PARAMSTR(1)));
  176.   IF NOT DExist(SesPath) THEN BEGIN
  177.     TextAttr := 12;
  178.     WRITELN('CRITICAL ERROR!!!');
  179.     WRITELN('-----------------');
  180.     WRITELN('The session path ' + SesPath);
  181.     WRITELN('does not exist, program halting...');
  182.     WRITE(^G);
  183.     TextAttr := 7;
  184.     GOTOXY(1,24); WRITE('Press Almost Any Key To Continue...');
  185.     READKEY;
  186.     ErrLevel := 6;
  187.     HALT(ErrLevel);
  188.   END;
  189.   IconLib16  := SesPath + 'ICON_LIB.001';
  190.   IconLib30  := SesPath + 'ICON_LIB.002';
  191.   IconLib60  := SesPath + 'ICON_LIB.003';
  192.   EditorFile := SesPath + 'EDITOR.TXT';
  193.   CheckResource(SesPath + 'ICON_LIB.001');
  194.   CheckResource(SesPath + 'ICON_LIB.002');
  195.   CheckResource(SesPath + 'ICON_LIB.003');
  196.   GuiInit := FireUpGui;
  197.   IF NOT GuiInit THEN BEGIN
  198.     TextAttr := 12;
  199.     WRITELN('CRITICAL ERROR!!!');
  200.     WRITELN('-----------------');
  201.     WRITELN('This program could not detect your video card chipset, nor could');
  202.     WRITELN('it detect an on-board VESA video BIOS...It is possible that your');
  203.     WRITELN('video card is not capable of running this program, you will need');
  204.     WRITELN('at least a 1 Meg VESA compatible video card first...Check to see');
  205.     WRITELN('that the file MAXVIDEO.CFG shows your correct video chipset #...');
  206.     WRITE(^G);
  207.     TextAttr := 7;
  208.     GOTOXY(1,24); WRITE('Press Almost Any Key To Continue...');
  209.     READKEY;
  210.     HALT;
  211.   END;
  212.   IF MouseInstalled THEN HideMouse;
  213.   ShadowText(267,2,15,0,2,'MAX Graphics v' + MaxID);
  214.   IF FExist(SesPath + 'BACKDROP.MAX') THEN ShowRemoteScreen('BACKDROP.MAX');
  215.   Draw_Window(0,0,639,479,2,'');
  216.   IndexResources;
  217. END;
  218. {───────────────────────────────────────────────────────────────────────────}
  219. PROCEDURE ShutDownDoor; Far;
  220. BEGIN
  221.   IF GuiInit THEN ShutDownGui;
  222. END;
  223. {───────────────────────────────────────────────────────────────────────────}
  224. PROCEDURE ReadCTL;
  225. BEGIN
  226. END;
  227. {───────────────────────────────────────────────────────────────────────────}
  228. PROCEDURE StartUpLog;
  229. BEGIN
  230.   Log('BEGIN');
  231.   Log('╔' + PadRight('','═',66) + '╗');
  232.   Log(PadRight('║ Connection Speed.....: 0 Baud',' ',67) + '║');
  233.   Log(PadRight('║ Free Memory..........: ' + IntToStr(MEMAVAIL) + ' Bytes',' ',67) + '║');
  234.   Log(PadRight('║ Running Under........: ' + OsStr,' ',67) + '║');
  235.   Log(PadRight('║ Comm Device..........: NONE',' ',67) + '║');
  236.   Log(PadRight('║ Terminal Emulation...: MAX',' ',67) + '║');
  237.   Log(PadRight('║ Active Date..........: ' + DateVariable,' ',67) + '║');
  238.   Log('╚' + PadRight('','═',66) + '╝');
  239. END;
  240. {───────────────────────────────────────────────────────────────────────────}
  241. PROCEDURE ClockOn;
  242. VAR
  243.   S100 : WORD;
  244. BEGIN
  245.   WITH CurTime DO BEGIN
  246.     GETTIME(Hour,Min,Sec,S100);
  247.     StartClock := (Hour * 3600) + (Min * 60) + Sec;
  248.   END;
  249. END;
  250. {───────────────────────────────────────────────────────────────────────────}
  251. PROCEDURE ClockOff;
  252. VAR
  253.   S100 : WORD;
  254. BEGIN
  255.   WITH CurTime DO BEGIN
  256.     GETTIME(Hour,Min,Sec,S100);
  257.     StopClock := (Hour * 3600) + (Min * 60) + Sec;
  258.   END;
  259. END;
  260. {───────────────────────────────────────────────────────────────────────────}
  261. PROCEDURE UpdateTime;
  262. BEGIN
  263.   ClockOff;
  264.   ClockResult := (StopClock - StartClock);
  265.   WITH DoorSys DO BEGIN
  266.     IF NOT Carrier THEN BEGIN
  267.       ErrLevel := 3;
  268.       HALT(ErrLevel);
  269.     END;
  270.     IF UpdateIdle THEN BEGIN
  271.       INC(IdleCount,ClockResult);
  272.       IF IdleCount = 300 THEN BEGIN {Halt for 5 minutes of user inactivity}
  273.         ErrLevel := 5;
  274.         HALT(ErrLevel);
  275.       END ELSE IF (IdleCount = 60) AND (Graphics <> MAX) THEN WRITE(^G); {Wake-Up the caller after 60 secs}
  276.     END ELSE IdleCount := 0;
  277.     IF UpdateSecs THEN BEGIN
  278.       DEC(SecondsLeft,ClockResult);
  279.       IF SecondsLeft <= 0 THEN BEGIN
  280.         ErrLevel := 4;
  281.         HALT(ErrLevel);
  282.       END;
  283.       MinutesLeft := SecondsLeft DIV 60;
  284.       Event       := MinutesLeft;
  285.     END;
  286.   END;
  287.   ClockOn;
  288. END;
  289. {───────────────────────────────────────────────────────────────────────────}
  290. PROCEDURE DeInitComport;
  291. BEGIN
  292. END;
  293. {───────────────────────────────────────────────────────────────────────────}
  294. FUNCTION GetChar : CHAR;
  295. BEGIN
  296.   GetChar := sReadKey;
  297. END;
  298. {───────────────────────────────────────────────────────────────────────────}
  299. PROCEDURE Lower_DTR;
  300. BEGIN
  301.   HALT;
  302. END;
  303. {───────────────────────────────────────────────────────────────────────────}
  304. FUNCTION DataAvailable : BOOLEAN;
  305. BEGIN
  306.   DataAvailable := FALSE;
  307. END;
  308. {───────────────────────────────────────────────────────────────────────────}
  309. PROCEDURE SendStr(S : STRING);
  310. BEGIN
  311.   ScrStr := S;
  312.   IF (POS(#12,ScrStr) > 0) OR (POS(' ~² ',ScrStr) > 0) OR (POS('START_SCREEN()',AllCaps(ScrStr)) > 0) THEN BEGIN
  313.     IF WindowNumber > 2 THEN REPEAT Kill_Window UNTIL WindowNumber = 2;
  314.     MaxMode := TRUE;
  315.     MouseOn := TRUE;
  316.     CheckControlLine(' ~² ');
  317.     EXIT;
  318.   END;
  319.   IF MaxMode THEN BEGIN
  320.     IF (TvPort.Active) AND (ScreenDone) THEN BEGIN
  321.       EraseCursor;
  322.       Display_ANSIstr(ScrStr);
  323.       PlaceCursor;
  324.     END ELSE BEGIN
  325.       ScrStr := StripBoth(ScrStr,' ');
  326.       ScrStr := StripBoth(ScrStr,#10);
  327.       ScrStr := StripBoth(ScrStr,#13);
  328.       ScrStr := StripBoth(ScrStr,#2);
  329.       IF POS(#255#126,ScrStr) = 1 THEN CheckControlLine(ScrStr) ELSE
  330.       IF POS(#255#125,ScrStr) = 1 THEN CheckColorCommand(ScrStr) ELSE
  331.       IF ScrStr <> '' THEN CheckScriptLine(ScrStr);
  332.     END;
  333.   END ELSE BEGIN
  334.     EraseCursor;
  335.     Display_ANSIstr(S);
  336.     PlaceCursor;
  337.   END;
  338. END;
  339. {───────────────────────────────────────────────────────────────────────────}
  340. PROCEDURE sCursorUp(N : BYTE);
  341. VAR
  342.   S : STRING[3];
  343. BEGIN
  344.   IF ((NOT MaxMode) OR (TvPort.Active)) AND (Where_Y > 1) THEN BEGIN
  345.     EraseCursor;
  346.     IF N > 1 THEN STR(N,S) ELSE S := '';
  347.     Display_ANSIstr(#27'[' + S + 'A');
  348.     PlaceCursor;
  349.   END;
  350. END;
  351. {───────────────────────────────────────────────────────────────────────────}
  352. PROCEDURE sCursorDown(N : BYTE);
  353. VAR
  354.   S : STRING[3];
  355. BEGIN
  356.   IF ((NOT MaxMode) OR (TvPort.Active)) AND (Where_Y < 25) THEN BEGIN
  357.     EraseCursor;
  358.     IF N > 1 THEN STR(N,S) ELSE S := '';
  359.     Display_ANSIstr(#27'[' + S + 'B');
  360.     PlaceCursor;
  361.   END;
  362. END;
  363. {───────────────────────────────────────────────────────────────────────────}
  364. PROCEDURE sCursorLeft(N : BYTE);
  365. VAR
  366.   S : STRING[3];
  367. BEGIN
  368.   IF ((NOT MaxMode) OR (TvPort.Active)) AND (Where_X > 1) THEN BEGIN
  369.     EraseCursor;
  370.     IF N > 80 THEN N := 80;
  371.     IF N > 1 THEN STR(N,S) ELSE S := '';
  372.     Display_ANSIStr(#27'[' + S + 'D');
  373.     PlaceCursor;
  374.   END;
  375. END;
  376. {───────────────────────────────────────────────────────────────────────────}
  377. PROCEDURE sCursorRight(N : BYTE);
  378. VAR
  379.   S : STRING[3];
  380. BEGIN
  381.   IF ((NOT MaxMode) OR (TvPort.Active)) AND (Where_X < 80) THEN BEGIN
  382.     EraseCursor;
  383.     IF N > 1 THEN STR(N,S) ELSE S := '';
  384.     Display_ANSIStr(#27'[' + S + 'C');
  385.     PlaceCursor;
  386.   END;
  387. END;
  388. {───────────────────────────────────────────────────────────────────────────}
  389. PROCEDURE sClrScr;
  390. BEGIN
  391.   IF (NOT MaxMode) OR (TvPort.Active) THEN BEGIN
  392.     EraseCursor;
  393.     Display_ANSIStr(#27'[2J');
  394.     PlaceCursor;
  395.   END;
  396. END;
  397. {───────────────────────────────────────────────────────────────────────────}
  398. PROCEDURE sClrEol;
  399. BEGIN
  400.   IF (NOT MaxMode) OR (TvPort.Active) THEN BEGIN
  401.     EraseCursor;
  402.     Display_ANSIStr(#27'[K');
  403.     PlaceCursor;
  404.   END;
  405. END;
  406. {───────────────────────────────────────────────────────────────────────────}
  407. PROCEDURE sGotoXY(X,Y : BYTE);
  408. BEGIN
  409.   IF (NOT MaxMode) OR (TvPort.Active) THEN BEGIN
  410.     EraseCursor;
  411.     Display_ANSIStr(#27'[' + IStr(Y,0) + ';' + IStr(X,0) + 'H');
  412.     PlaceCursor;
  413.   END;
  414. END;
  415. {───────────────────────────────────────────────────────────────────────────}
  416. PROCEDURE FlushOutput;
  417. BEGIN
  418. END;
  419. {───────────────────────────────────────────────────────────────────────────}
  420. PROCEDURE PurgeOutPut;
  421. BEGIN
  422. END;
  423. {───────────────────────────────────────────────────────────────────────────}
  424. PROCEDURE PurgeInput;
  425. BEGIN
  426. END;
  427. {───────────────────────────────────────────────────────────────────────────}
  428. PROCEDURE sWriteC(C : CHAR);
  429. BEGIN
  430.   IF C = #12 THEN BEGIN
  431.     IF WindowNumber > 2 THEN REPEAT Kill_Window UNTIL WindowNumber = 2;
  432.     MaxMode := TRUE;
  433.     MouseOn := TRUE;
  434.     CheckControlLine(' ~² ');
  435.     EXIT;
  436.   END;
  437.   IF (NOT MaxMode) OR (TvPort.Active) THEN BEGIN
  438.     EraseCursor;
  439.     Display_ANSI(C);
  440.     PlaceCursor;
  441.   END;
  442. END;
  443. {───────────────────────────────────────────────────────────────────────────}
  444. PROCEDURE sWrite(S : STRING);
  445. BEGIN
  446.   IF (POS(#12,S) > 0) OR (POS(' ~² ',S) > 0) OR (POS('START_SCREEN()',AllCaps(S)) > 0) THEN BEGIN
  447.     IF WindowNumber > 2 THEN REPEAT Kill_Window UNTIL WindowNumber = 2;
  448.     MaxMode := TRUE;
  449.     MouseOn := TRUE;
  450.     CheckControlLine(' ~² ');
  451.     EXIT;
  452.   END;
  453.   IF (NOT MaxMode) OR (TvPort.Active) THEN BEGIN
  454.     EraseCursor;
  455.     Display_ANSIstr(S);
  456.     PlaceCursor;
  457.   END;
  458. END;
  459. {───────────────────────────────────────────────────────────────────────────}
  460. PROCEDURE sWriteln(S : STRING);
  461. BEGIN
  462.   IF (POS(#12,S) > 0) OR (POS(' ~² ',S) > 0) OR (POS('START_SCREEN()',AllCaps(S)) > 0) THEN BEGIN
  463.     IF WindowNumber > 2 THEN REPEAT Kill_Window UNTIL WindowNumber = 2;
  464.     MaxMode := TRUE;
  465.     MouseOn := TRUE;
  466.     CheckControlLine(' ~² ');
  467.     EXIT;
  468.   END;
  469.   IF (NOT MaxMode) OR (TvPort.Active) THEN BEGIN
  470.     EraseCursor;
  471.     Display_ANSIstr(S + #13#10);
  472.     PlaceCursor;
  473.   END;
  474. END;
  475. {───────────────────────────────────────────────────────────────────────────}
  476. FUNCTION sKeyPressed : BOOLEAN;
  477. VAR
  478.   ButNum : BYTE;
  479. BEGIN
  480.   sKeyPressed := FALSE;
  481.   s_ReadKey   := '';
  482.   ButNum      := MouseHandler(TRUE);
  483.   IF (PickInfo.Active) OR (TextReader.Active) OR (NFields <> 0) THEN BEGIN
  484.     IF (PickInfo.Active) OR (TextReader.Active) THEN BEGIN
  485.       IF ButNum > 2 THEN MC := CHR(Buttons[ButNum].Return) ELSE MC := #255;
  486.     END ELSE BEGIN
  487.       IF ButNum <> 0 THEN MC := CHR(Buttons[ButNum].Return) ELSE MC := #255;
  488.     END;
  489.   END ELSE BEGIN
  490.     IF ButNum <> 0 THEN MC := CHR(Buttons[ButNum].Return);
  491.   END;
  492.   IF MC <> #255 THEN BEGIN
  493.     IF (ButNum <> 0) AND (Buttons[ButNum].Sound <> #0) THEN PlayButtonSound(Buttons[ButNum].Sound);
  494.     s_ReadKey   := MC;
  495.     sKeyPressed := TRUE;
  496.   END;
  497. END;
  498. {───────────────────────────────────────────────────────────────────────────}
  499. PROCEDURE sWaitInput(Ms : INTEGER);
  500. VAR
  501.   I : INTEGER;
  502. BEGIN
  503.   I := Ms DIV 10;
  504.   WHILE NOT ((I = 0) OR sKeyPressed) DO BEGIN
  505.     DELAY(10);
  506.     DEC(I);
  507.   END;
  508. END;
  509. {───────────────────────────────────────────────────────────────────────────}
  510. FUNCTION sReadKey : CHAR;
  511. VAR
  512.   ButNum    : BYTE;
  513.   LastCheck : BYTE;
  514.   S100      : WORD;
  515. BEGIN
  516.   WITH CurTime DO GETTIME(Hour,Min,Sec,S100);
  517.   LastCheck         := CurTime.Sec;
  518.   DoorSys.IdleCount := 0;
  519.   IF s_ReadKey <> '' THEN BEGIN
  520.     UpdateTime;
  521.     MC        := s_ReadKey[1];
  522.     s_ReadKey := '';
  523.     sReadKey  := MC;
  524.     EXIT;
  525.   END;
  526.   REPEAT
  527.     WITH CurTime DO GETTIME(Hour,Min,Sec,S100);
  528.     IF LastCheck <> CurTime.Sec THEN BEGIN
  529.       UpdateTime;
  530.       LastCheck := CurTime.Sec;
  531.     END;
  532.     ButNum := MouseHandler(TRUE);
  533.     IF (PickInfo.Active) OR (TextReader.Active) OR (NFields <> 0) THEN BEGIN
  534.       IF (PickInfo.Active) OR (TextReader.Active) THEN BEGIN
  535.         IF ButNum > 2 THEN MC := CHR(Buttons[ButNum].Return) ELSE MC := #255;
  536.       END ELSE BEGIN
  537.         IF ButNum <> 0 THEN MC := CHR(Buttons[ButNum].Return) ELSE MC := #255;
  538.       END;
  539.     END ELSE BEGIN
  540.       IF ButNum <> 0 THEN MC := CHR(Buttons[ButNum].Return);
  541.     END;
  542.   UNTIL MC <> #255;
  543.   IF (ButNum <> 0) AND (Buttons[ButNum].Sound <> #0) THEN PlayButtonSound(Buttons[ButNum].Sound);
  544.   sReadKey := MC;
  545. END;
  546. {───────────────────────────────────────────────────────────────────────────}
  547. FUNCTION AnsiColor : STRING;
  548. BEGIN
  549.   AnsiColor := '';
  550. END;
  551. {───────────────────────────────────────────────────────────────────────────}
  552. PROCEDURE SetFore(Fore : BYTE);
  553. BEGIN
  554.   ANSI_FG := Fore;
  555. END;
  556. {───────────────────────────────────────────────────────────────────────────}
  557. PROCEDURE SetBack(Back : BYTE);
  558. BEGIN
  559.   ANSI_BG := Back;
  560. END;
  561. {───────────────────────────────────────────────────────────────────────────}
  562. PROCEDURE Set_Color(Fore,Back : BYTE);
  563. BEGIN
  564.   ANSI_FG := Fore;
  565.   ANSI_BG := Back;
  566. END;
  567. {───────────────────────────────────────────────────────────────────────────}
  568. PROCEDURE ShowStatusBar;
  569. BEGIN
  570. END;
  571. {───────────────────────────────────────────────────────────────────────────}
  572. PROCEDURE HideStatusBar;
  573. BEGIN
  574. END;
  575. {───────────────────────────────────────────────────────────────────────────}
  576. PROCEDURE AutoDetect;
  577. BEGIN
  578. END;
  579. {───────────────────────────────────────────────────────────────────────────}
  580. PROCEDURE FakeVirus;
  581. BEGIN
  582. END;
  583. {───────────────────────────────────────────────────────────────────────────}
  584. PROCEDURE ReadDorInfo(DoorFn : PathStr; VAR DropInfo : tDoor);
  585. BEGIN
  586. END;
  587. {───────────────────────────────────────────────────────────────────────────}
  588. PROCEDURE ReadDoorSys(DoorFn : PathStr; VAR DropInfo : tDoor);
  589. BEGIN
  590. END;
  591. {───────────────────────────────────────────────────────────────────────────}
  592. PROCEDURE ReadMxUserDat(DoorFn : PathStr; VAR DropInfo : tDoor);
  593. BEGIN
  594. END;
  595. {───────────────────────────────────────────────────────────────────────────}
  596. PROCEDURE CommandLineHelp;
  597. BEGIN
  598. END;
  599. {───────────────────────────────────────────────────────────────────────────}
  600. PROCEDURE ShowProgramAd;
  601. BEGIN
  602.   Set_Color(7,0);
  603.   sClrScr;
  604.   LineBar(1,0,79);
  605.   IceText(ProgramName,TRUE);
  606.   IceText(ProgramDesc,TRUE);
  607.   IceText(Copyright,TRUE);
  608.   LineBar(1,0,79);
  609. END;
  610. {───────────────────────────────────────────────────────────────────────────}
  611. PROCEDURE CPrompt(HotKey : CHAR ; Txt : STRING);
  612. BEGIN
  613. END;
  614. {───────────────────────────────────────────────────────────────────────────}
  615. PROCEDURE MenuKey(X,Y : BYTE ; HotKey : CHAR ; Txt : STRING);
  616. BEGIN
  617. END;
  618. {───────────────────────────────────────────────────────────────────────────}
  619. PROCEDURE YesNoBox;
  620. BEGIN
  621. END;
  622. {───────────────────────────────────────────────────────────────────────────}
  623. PROCEDURE FancyPrompt;
  624. BEGIN
  625. END;
  626. {───────────────────────────────────────────────────────────────────────────}
  627. PROCEDURE Select;
  628. BEGIN
  629. END;
  630. {───────────────────────────────────────────────────────────────────────────}
  631. PROCEDURE YnPrompt(Txt : STRING);
  632. BEGIN
  633. END;
  634. {───────────────────────────────────────────────────────────────────────────}
  635. PROCEDURE NyPrompt(Txt : STRING);
  636. BEGIN
  637. END;
  638. {───────────────────────────────────────────────────────────────────────────}
  639. PROCEDURE AnyKey;
  640. BEGIN
  641.   Set_Color(1,0);  sWrite('░▒▓');
  642.   Set_Color(15,1); sWrite(' Press Any Key To Continue ');
  643.   Set_Color(1,0);  sWrite('▓▒░');
  644.   sReadKey;
  645. END;
  646. {───────────────────────────────────────────────────────────────────────────}
  647. PROCEDURE OutTxt(FG,BG : BYTE ; Txt : STRING);
  648. BEGIN
  649.   Set_Color(FG,BG);
  650.   sWrite(Txt);
  651. END;
  652. {───────────────────────────────────────────────────────────────────────────}
  653. PROCEDURE OutTxtL(FG,BG : BYTE ; Txt : STRING);
  654. BEGIN
  655.   Set_Color(FG,BG);
  656.   sWriteln(Txt);
  657. END;
  658. {───────────────────────────────────────────────────────────────────────────}
  659. PROCEDURE OutTxtXY(X,Y,FG,BG : BYTE ; Txt : STRING);
  660. BEGIN
  661.   sGotoXY(X,Y);
  662.   Set_Color(FG,BG);
  663.   sWrite(Txt);
  664. END;
  665. {───────────────────────────────────────────────────────────────────────────}
  666. PROCEDURE OutTxtXYL(X,Y,FG,BG : BYTE ; Txt : STRING);
  667. BEGIN
  668.   sGotoXY(X,Y);
  669.   Set_Color(FG,BG);
  670.   sWriteln(Txt);
  671. END;
  672. {───────────────────────────────────────────────────────────────────────────}
  673. PROCEDURE LineBar(FG,BG,L : BYTE);
  674. VAR
  675.   Loop : BYTE;
  676.   S    : STRING[80];
  677. BEGIN
  678.   Set_Color(FG,BG);
  679.   S := '';
  680.   FOR Loop := 1 TO L DO S := S + '─';
  681.   sWriteln(S);
  682. END;
  683. {───────────────────────────────────────────────────────────────────────────}
  684. FUNCTION InputDriver(Len : BYTE; Name,Showit,AllCap,NumInput : BOOLEAN; tLine : STRING) : STRING;
  685. BEGIN
  686.   InputDriver := '';
  687. END;
  688. {──────────────────────────────────────────────────────────────────────────}
  689. FUNCTION SecretInput(Len : BYTE; Default : STRING) : STRING;
  690. BEGIN
  691.   SecretInput := InputDriver(Len,FALSE,FALSE,FALSE,FALSE,Default);
  692. END;
  693. {──────────────────────────────────────────────────────────────────────────}
  694. FUNCTION NameInput(Len : BYTE; Default : STRING) : STRING;
  695. BEGIN
  696.   NameInput := InputDriver(Len,TRUE,TRUE,FALSE,FALSE,Default);
  697. END;
  698. {──────────────────────────────────────────────────────────────────────────}
  699. FUNCTION NormalInput(Len : BYTE; Default : STRING) : STRING;
  700. BEGIN
  701.   NormalInput := InputDriver(Len,FALSE,TRUE,FALSE,FALSE,Default);
  702. END;
  703. {──────────────────────────────────────────────────────────────────────────}
  704. FUNCTION CapsInput(Len : BYTE; Default : STRING) : STRING;
  705. BEGIN
  706.   CapsInput := InputDriver(Len,FALSE,TRUE,TRUE,FALSE,Default);
  707. END;
  708. {──────────────────────────────────────────────────────────────────────────}
  709. FUNCTION NumberInput(Len : BYTE; Default : STRING) : STRING;
  710. BEGIN
  711.   NumberInput := InputDriver(Len,FALSE,TRUE,FALSE,TRUE,Default);
  712. END;
  713. {───────────────────────────────────────────────────────────────────────────}
  714. FUNCTION NamePrompt(StrLength : BYTE ; InStr : STRING) : STRING;
  715. BEGIN
  716.   NamePrompt := NameInput(StrLength,InStr);
  717. END;
  718. {───────────────────────────────────────────────────────────────────────────}
  719. FUNCTION NormalPrompt(StrLength : BYTE ; InStr : STRING) : STRING;
  720. BEGIN
  721.   NormalPrompt := NormalInput(StrLength,InStr);
  722. END;
  723. {───────────────────────────────────────────────────────────────────────────}
  724. FUNCTION NumberPrompt(StrLength : BYTE ; InStr : STRING) : STRING;
  725. BEGIN
  726.   NumberPrompt := NumberInput(StrLength,InStr);
  727. END;
  728. {───────────────────────────────────────────────────────────────────────────}
  729. FUNCTION SecretPrompt(StrLength : BYTE ; InStr : STRING) : STRING;
  730. BEGIN
  731.   SecretPrompt := SecretInput(StrLength,InStr);
  732. END;
  733. {───────────────────────────────────────────────────────────────────────────}
  734. FUNCTION CapsPrompt(StrLength : BYTE ; InStr : STRING) : STRING;
  735. BEGIN
  736.   CapsPrompt := CapsInput(StrLength,InStr);
  737. END;
  738. {───────────────────────────────────────────────────────────────────────────}
  739. FUNCTION SysField(X,Y,Style,StrLength : BYTE ; InStr : STRING) : STRING;
  740. BEGIN
  741.   SysField := '';
  742. END;
  743. {───────────────────────────────────────────────────────────────────────────}
  744. PROCEDURE DummyField(X,Y,StrLength : BYTE ; InStr : STRING);
  745. BEGIN
  746. END;
  747. {───────────────────────────────────────────────────────────────────────────}
  748. PROCEDURE DrawWin(X1,Y1,X2,Y2 : BYTE ; Title : STRING);
  749. BEGIN
  750. END;
  751. {───────────────────────────────────────────────────────────────────────────}
  752. PROCEDURE ClearWin(X1,Y1,X2,Y2 : BYTE);
  753. BEGIN
  754. END;
  755. {───────────────────────────────────────────────────────────────────────────}
  756. PROCEDURE DrawButton(HotKey : CHAR ; Txt : STRING ; HighLight : BOOLEAN);
  757. BEGIN
  758. END;
  759. {───────────────────────────────────────────────────────────────────────────}
  760. PROCEDURE SysButton(X,Y : BYTE ; HotKey : CHAR ; Txt : STRING);
  761. BEGIN
  762. END;
  763. {───────────────────────────────────────────────────────────────────────────}
  764. PROCEDURE DrawMenu(X1,Y1,X2,Y2 : BYTE);
  765. BEGIN
  766. END;
  767. {───────────────────────────────────────────────────────────────────────────}
  768. PROCEDURE MenuItem(X,Y : BYTE ; HotKey : CHAR ; Txt : STRING);
  769. BEGIN
  770. END;
  771. {───────────────────────────────────────────────────────────────────────────}
  772. PROCEDURE MenuLine(X,Y,L : BYTE);
  773. BEGIN
  774. END;
  775. {───────────────────────────────────────────────────────────────────────────}
  776. PROCEDURE MenuBarItem(X,Y : BYTE ; HotKey : CHAR ; Txt : STRING);
  777. BEGIN
  778. END;
  779. {───────────────────────────────────────────────────────────────────────────}
  780. PROCEDURE IceText(S : STRING ; LF : BOOLEAN);
  781. VAR
  782.   TLength : BYTE;
  783.   Loop    : BYTE;
  784. BEGIN
  785.   TLength  := LENGTH(S);
  786.   FOR Loop := 1 TO TLength DO BEGIN
  787.     IF (ORD(S[Loop]) >= 65) AND (ORD(S[Loop]) <= 90) THEN Set_Color(15,0) ELSE
  788.     IF (ORD(S[Loop]) >= 97) AND (ORD(S[Loop]) <= 122) THEN Set_Color(11,0) ELSE
  789.     IF (ORD(S[Loop]) > 127) OR (ORD(S[Loop]) < 32) THEN Set_Color(1,0) ELSE Set_Color(9,0);
  790.     sWrite(S[Loop]);
  791.   END;
  792.   IF LF THEN sWriteln('');
  793. END;
  794. {───────────────────────────────────────────────────────────────────────────}
  795. PROCEDURE InfoBox(Width : BYTE ; Height : BYTE);
  796. BEGIN
  797. END;
  798. {───────────────────────────────────────────────────────────────────────────}
  799. PROCEDURE InfoText(Txt : STRING);
  800. VAR
  801.   LB,RB : STRING[4];
  802. BEGIN
  803.   LB := '░▒▓█';
  804.   RB := '█▓▒░';
  805.   Set_Color(1,0);  sWrite(LB);
  806.   Set_Color(15,1); sWrite(Txt);
  807.   Set_Color(1,0);  sWrite(RB);
  808. END;
  809. {───────────────────────────────────────────────────────────────────────────}
  810. PROCEDURE RunEntryForm(ScriptFile : STRING);
  811. BEGIN
  812. END;
  813. {───────────────────────────────────────────────────────────────────────────}
  814. FUNCTION GoodColor(TempStr : STRING ; ChangeColor : BOOLEAN) : BOOLEAN;
  815. VAR
  816.   FG : BYTE;
  817. BEGIN
  818.   FG := 50;
  819.   IF TempStr = '{0}'  THEN FG := 0;
  820.   IF TempStr = '{1}'  THEN FG := 1;
  821.   IF TempStr = '{2}'  THEN FG := 2;
  822.   IF TempStr = '{3}'  THEN FG := 3;
  823.   IF TempStr = '{4}'  THEN FG := 4;
  824.   IF TempStr = '{5}'  THEN FG := 5;
  825.   IF TempStr = '{6}'  THEN FG := 6;
  826.   IF TempStr = '{7}'  THEN FG := 7;
  827.   IF TempStr = '{8}'  THEN FG := 8;
  828.   IF TempStr = '{9}'  THEN FG := 9;
  829.   IF TempStr = '{10}' THEN FG := 10;
  830.   IF TempStr = '{11}' THEN FG := 11;
  831.   IF TempStr = '{12}' THEN FG := 12;
  832.   IF TempStr = '{13}' THEN FG := 13;
  833.   IF TempStr = '{14}' THEN FG := 14;
  834.   IF TempStr = '{15}' THEN FG := 15;
  835.   IF TempStr = '{16}' THEN FG := 16;
  836.   IF TempStr = '{17}' THEN FG := 17;
  837.   IF TempStr = '{18}' THEN FG := 18;
  838.   IF TempStr = '{19}' THEN FG := 19;
  839.   IF TempStr = '{20}' THEN FG := 20;
  840.   IF TempStr = '{21}' THEN FG := 21;
  841.   IF TempStr = '{22}' THEN FG := 22;
  842.   IF TempStr = '{23}' THEN FG := 23;
  843.   IF TempStr = '{24}' THEN FG := 24;
  844.   IF TempStr = '{25}' THEN FG := 25;
  845.   IF TempStr = '{26}' THEN FG := 26;
  846.   IF TempStr = '{27}' THEN FG := 27;
  847.   IF TempStr = '{28}' THEN FG := 28;
  848.   IF TempStr = '{29}' THEN FG := 29;
  849.   IF TempStr = '{30}' THEN FG := 30;
  850.   IF TempStr = '{31}' THEN FG := 31;
  851.   IF FG <> 50 THEN BEGIN
  852.     IF ChangeColor THEN SetFore(FG);
  853.     GoodColor := TRUE;
  854.   END ELSE GoodColor := FALSE;
  855. END;
  856. {───────────────────────────────────────────────────────────────────────────}
  857. FUNCTION StripColors(InStr : STRING) : STRING;
  858. VAR
  859.   Loop : BYTE;
  860.   Cvt  : BOOLEAN;
  861.   Temp : STRING;
  862.   Hold : STRING;
  863. BEGIN
  864.   Cvt  := FALSE;
  865.   Temp := '';
  866.   Hold := '';
  867.   FOR Loop := 1 TO LENGTH(InStr) DO BEGIN
  868.     IF InStr[Loop] = '{' THEN Cvt := TRUE;
  869.     IF Cvt THEN Temp := Temp + InStr[Loop]
  870.            ELSE Hold := Hold + InStr[Loop];
  871.     IF ((Cvt) AND (InStr[Loop] = '}')) OR (Loop = LENGTH(InStr)) THEN BEGIN
  872.       IF NOT GoodColor(Temp,FALSE) THEN Hold := Hold + Temp;
  873.       Cvt  := FALSE;
  874.       Temp := '';
  875.     END;
  876.   END;
  877.   StripColors := Hold;
  878. END;
  879. {───────────────────────────────────────────────────────────────────────────}
  880. PROCEDURE CvtColors(InStr : STRING ; LF : BOOLEAN);
  881. VAR
  882.   Loop : BYTE;
  883.   Cvt  : BOOLEAN;
  884.   Temp : STRING;
  885. BEGIN
  886.   Cvt  := FALSE;
  887.   Temp := '';
  888.   FOR Loop := 1 TO LENGTH(InStr) DO BEGIN
  889.     IF InStr[Loop] = '{' THEN Cvt := TRUE;
  890.     IF NOT Cvt THEN sWriteC(InStr[Loop]);
  891.     IF Cvt THEN Temp := Temp + InStr[Loop];
  892.     IF (Cvt) AND (InStr[Loop] = '}') THEN BEGIN
  893.       IF NOT GoodColor(Temp,TRUE) THEN sWrite(Temp);
  894.       Cvt  := FALSE;
  895.       Temp := '';
  896.     END;
  897.   END;
  898.   IF LF THEN sWriteln('');
  899. END;
  900. {───────────────────────────────────────────────────────────────────────────}
  901. PROCEDURE RipToText;
  902. BEGIN
  903.   IF WindowNumber > 2 THEN REPEAT Kill_Window UNTIL WindowNumber = 2;
  904.   HideMouse;
  905.   MaxMode := FALSE;
  906.   MouseOn := FALSE;
  907.   Draw_Window(0,0,639,439,2,'');
  908.   FG_SetColor(0);
  909.   FG_ClpRect(0,639,21,421);
  910.   ResetANSI;
  911.   Clr_Scr;
  912.   RaisedBox(0,421,639,441);
  913.   ShadowText(287,423,15,0,2,'ANSI Emulation');
  914. END;
  915. {───────────────────────────────────────────────────────────────────────────}
  916. PROCEDURE ShowTextFile(TextFile : STRING);
  917. TYPE TextData = RECORD
  918.      TLine    : STRING;
  919.      END;
  920. VAR
  921.   T         : TextData;
  922.   TDat      : FILE OF TextData;
  923.   Ch        : CHAR;
  924.   Count,
  925.   SvgaY,
  926.   Loop,Cnt  : INTEGER;
  927.   File_Name : TEXT;
  928. BEGIN;
  929.   ASSIGN(File_Name,TextFile);
  930.   ASSIGN(TDat,GetFilePath(TextFile) + 'TEXT' + IntToStr(DoorSys.Node) + '.DAT');
  931.   IF NOT FExist(TextFile) THEN BEGIN
  932.     ErrorLog('Text File Not Found: ' + TextFile,6,FALSE);
  933.     EXIT;
  934.   END;
  935.   RESET(File_Name);
  936.   REWRITE(TDat);
  937.   Count := 0;
  938.   Cnt   := 0;
  939.   IF Graphics = MAX THEN BEGIN
  940.     SendStr(#13#10);
  941.     SendStr(#12#13#10);
  942.     SendStr(' ~² '+#13#10);
  943.     SendStr(' ~Ç1,21,638,47,1,''Text Reader'' '+#13#10);
  944.     SendStr(' ~ƒ1,48,637,349,246 '+#13#10);
  945.     SendStr(' ~ó0,47,638,350,8 '+#13#10);
  946.     SendStr(' ~ƒ1,351,637,390,243 '+#13#10);
  947.     SendStr(' ~ó0,350,638,391,8 '+#13#10);
  948.     SendStr(' ~É1,351,637,390 '+#13#10);
  949.     SendStr(' ~«10,361,80,20,81 '+#13#10);
  950.     SendStr(' ~«100,361,80,20,84 '+#13#10);
  951.     SendStr(' ~«190,361,80,20,66 '+#13#10);
  952.     SendStr(' ~«280,361,80,20,80 '+#13#10);
  953.     SendStr(' ~«370,361,80,20,13 '+#13#10);
  954.     SendStr(' ~Ä38,363,4,2,''Q{0}uit'' '+#13#10);
  955.     SendStr(' ~Ä128,363,4,2,''T{0}op'' '+#13#10);
  956.     SendStr(' ~Ä209,363,4,2,''B{0}ottom'' '+#13#10);
  957.     SendStr(' ~Ä295,363,4,2,''P{0}revious'' '+#13#10);
  958.     SendStr(' ~Ä394,363,4,2,''M{0}ore'' '+#13#10);
  959.     SendStr(' ~■ '+#13#10);
  960.     SendStr(' ~»0 ' + #13#10);
  961.     SendStr(' ~ï ' + #13#10);
  962.   END;
  963.   WHILE NOT EOF (File_Name) DO BEGIN
  964.     INC(Cnt);
  965.     READLN(File_Name,T.TLine);
  966.     FOR Count := 1 TO LENGTH(T.TLine) DO IF T.TLine[Count] = ' ' THEN T.TLine[Count] := ' ';
  967.     T.TLine := CvtVars(T.TLine);
  968.     WRITE(TDat,T);
  969.   END;
  970.   CLOSE(File_Name);
  971.   RESET(TDat);
  972.   Count := 0;
  973.   SvgaY := 38;
  974.   WHILE NOT EOF(TDat) DO BEGIN
  975.     INC(Count);
  976.     READ(TDat,T);
  977.     INC(SvgaY,14);
  978.     SendStr(' ~Ä5,' + IntToStr(SvgaY) + ',0,3,' + #39 + T.TLine + #39 + ' ' + #13#10);
  979.     IF (Count = 21) OR EOF(TDat) THEN BEGIN
  980.       SendStr(' ~î ' + #13#10);
  981.       REPEAT Ch := UPCASE(sReadKey) UNTIL Ch IN ['Q','T','B','P','M',#13,#27];
  982.       IF Ch = #27 THEN Ch := 'Q';
  983.       CASE Ch OF
  984.         'Q' : BEGIN
  985.                 CLOSE(TDat);
  986.                 ERASE(TDat);
  987.                 EXIT;
  988.               END;
  989.         'T' : BEGIN
  990.                 Count := 0;
  991.                 SEEK(TDat,Count);
  992.               END;
  993.         'B' : BEGIN
  994.                 Count := Cnt - 21;
  995.                 IF Count < 0 THEN Count := 0;
  996.                 SEEK(TDat,Count);
  997.                 Count := 0;
  998.               END;
  999.         'P' : BEGIN
  1000.                 Count := (FILEPOS(TDat) - 42);
  1001.                 IF Count < 0 THEN Count := 0;
  1002.                 SEEK(TDat,Count);
  1003.                 Count := 0;
  1004.               END;
  1005.         ELSE Count := 0;
  1006.       END;
  1007.       IF (Ch <> 'Q') AND (NOT EOF(TDat)) THEN BEGIN
  1008.         SvgaY := 38;
  1009.         SendStr(' ~ï ' + #13#10);
  1010.         SendStr(' ~ƒ1,48,637,349,246 ' + #13#10);
  1011.       END;
  1012.     END;
  1013.   END;
  1014.   CLOSE(TDat);
  1015.   ERASE(TDat);
  1016. END;
  1017. {───────────────────────────────────────────────────────────────────────────}
  1018. PROCEDURE ShowScreen(Scr : STRING);
  1019. VAR
  1020.   File_Name : TEXT;
  1021. BEGIN;
  1022.   IF NOT FExist(Scr) THEN EXIT;
  1023.   IF (MaxMode) AND (NOT NoKill) AND (WindowNumber > 2) THEN REPEAT Kill_Window UNTIL WindowNumber = 2;
  1024.   HideMouse;
  1025.   ASSIGN(File_Name,Scr);
  1026.   RESET(File_Name);
  1027.   WHILE NOT EOF(File_Name) DO BEGIN
  1028.     READLN(File_Name,ScrStr);
  1029.     ScrStr := CvtVars(ScrStr);
  1030.     IF MaxMode THEN BEGIN
  1031.       IF (TvPort.Active) AND (ScreenDone) THEN BEGIN
  1032.         EraseCursor;
  1033.         Display_ANSIstr(ScrStr);
  1034.         PlaceCursor;
  1035.       END ELSE BEGIN
  1036.         ScrStr := StripBoth(ScrStr,' ');
  1037.         ScrStr := StripBoth(ScrStr,#2);
  1038.         IF POS(#255#126,ScrStr) = 1 THEN CheckControlLine(ScrStr) ELSE
  1039.         IF POS(#255#125,ScrStr) = 1 THEN CheckColorCommand(ScrStr) ELSE
  1040.         IF ScrStr <> '' THEN CheckScriptLine(ScrStr);
  1041.       END;
  1042.     END ELSE BEGIN
  1043.       IF (POS(#12,ScrStr) > 0) OR (POS(' ~² ',ScrStr) > 0) OR (POS('START_SCREEN()',AllCaps(ScrStr)) > 0) THEN BEGIN
  1044.         IF WindowNumber > 2 THEN REPEAT Kill_Window UNTIL WindowNumber = 2;
  1045.         MaxMode := TRUE;
  1046.         MouseOn := TRUE;
  1047.         CheckControlLine(' ~² ');
  1048.       END ELSE BEGIN
  1049.         IF NOT EOF(File_Name) THEN sWriteLn(ScrStr) ELSE sWrite(ScrStr);
  1050.       END;
  1051.     END;
  1052.   END;
  1053.   CLOSE(File_Name);
  1054.   NoKill := FALSE;
  1055.   IF (MaxMode) AND (MouseOn) THEN ShowMouse;
  1056. END;
  1057. {───────────────────────────────────────────────────────────────────────────}
  1058. PROCEDURE nstText(S : STRING ; LF : BOOLEAN);
  1059. VAR
  1060.   Len  : BYTE;
  1061.   Loop : BYTE;
  1062.   Bool : BOOLEAN;
  1063. BEGIN
  1064.   Len  := LENGTH(S);
  1065.   Bool := FALSE;
  1066.   FOR Loop := 1 TO Len DO BEGIN
  1067.     IF S[Loop] IN ['.',':','■'] THEN Set_Color(8,0) ELSE
  1068.     IF Bool THEN Set_Color(11,0) ELSE Set_Color(3,0);
  1069.     IF S[Loop] = ' : ' THEN Bool := TRUE;
  1070.     sWrite(S[Loop]);
  1071.   END;
  1072.   IF LF THEN sWriteln('');
  1073. END;
  1074. {───────────────────────────────────────────────────────────────────────────}
  1075. PROCEDURE ChatSelect;
  1076. BEGIN
  1077. END;
  1078. {───────────────────────────────────────────────────────────────────────────}
  1079. PROCEDURE DVWrite(X,Y : WORD; Attr : BYTE; S : STRING);
  1080. BEGIN
  1081. END;
  1082. {───────────────────────────────────────────────────────────────────────────}
  1083. PROCEDURE AlertTones;
  1084. VAR
  1085.   Loop : BYTE;
  1086. BEGIN
  1087.   FOR Loop := 1 TO 5 DO BEGIN
  1088.     WRITE(^G);
  1089.     DELAY(200);
  1090.   END
  1091. END;
  1092. {───────────────────────────────────────────────────────────────────────────}
  1093. VAR
  1094.   U : WORD;
  1095. BEGIN
  1096.   GETDIR(0,HomeDir);
  1097.   DetectOS;
  1098.   Tdk_Vars.OS   := Gui_Util.OS;
  1099.   ResPath       := HomeDir + '\RESOURCE\';
  1100.   SesPath       := HomeDir + '\SESSION\';
  1101.   DownPath1     := HomeDir + '\DOWNS\';
  1102.   DownPath2     := DownPath1;
  1103.   ScrStr        := '';
  1104.   BackDropImage := '';
  1105.   C.ScreenColor := 33;
  1106.   ShowBanner    := FALSE;
  1107.   MaxID         := '2.03';
  1108.   Graphics      := MAX;
  1109.   MouseOn       := TRUE;
  1110.   UseSB         := TRUE;
  1111.   WITH SB DO BEGIN    {Be absolutely sure these settings match your  }
  1112.     IRQ     := '2';   {SoundBlaster settings or you will lock up the }
  1113.     DMA     := '1';   {computer tight as a drum as soon as you play  }
  1114.     Address := '220'; {any sound files....You have been warned....   }
  1115.   END;
  1116.   GETTIME(StartTime.Hour,StartTime.Min,StartTime.Sec,U);
  1117.   GETDATE(StartTime.Year,StartTime.Month,StartTime.Day,U);
  1118.   AddtoExitChain(ShutDownDoor);
  1119.   WITH CTL DO BEGIN
  1120.     Month        := StartTime.Month;
  1121.     Day          := StartTime.Day;
  1122.     Year         := StartTime.Year;
  1123.     SFirst       := 'The';
  1124.     SLast        := 'SysOp';
  1125.     SysSec       := 500;
  1126.     BBSname      := 'The BBS';
  1127.     SerialNumber := '';
  1128.     HomePath     := '';
  1129.     UseFossil    := FALSE;
  1130.     PortSpeed    := 38400;
  1131.     UseDigi      := FALSE;
  1132.     WordSize     := 8;
  1133.     Parity       := 'N';
  1134.     StopBits     := 1;
  1135.     InBuffer     := 4096;
  1136.     OutBuffer    := 4096;
  1137.     NSP          := FALSE;
  1138.     Port         := 0;
  1139.     IRQ          := 4;
  1140.     HexAddr      := '03F8';
  1141.   END;
  1142.   WITH CS DO BEGIN
  1143.     Hfg         := 15;
  1144.     Hbg         := 3;
  1145.     Wbg         := 1;
  1146.     Wh          := 9;
  1147.     Wl          := 0;
  1148.     Sfg         := 8;
  1149.     Sbg         := 0;
  1150.     Ffg         := 15;
  1151.     Fbg         := 1;
  1152.     Bfg         := 14;
  1153.     TxFG        := 3;
  1154.     TxBG        := 0;
  1155.     CPBfg       := 9;
  1156.     CPBbg       := 0;
  1157.     CPKfg       := 14;
  1158.     CPKbg       := 0;
  1159.     CPTfg       := 13;
  1160.     CPTbg       := 0;
  1161.   END;
  1162.   WITH DoorSys DO BEGIN
  1163.     UserName        := 'Joe User';
  1164.     Alias           := UserName;
  1165.     UserCity        := 'AnyTown, AnyState';
  1166.     PassWord        := 'PASSWORD';
  1167.     Phone           := '123-456-7890';
  1168.     WorkPhone       := Phone;
  1169.     BBSname         := 'The BBS';
  1170.     SysopName       := 'The SysOp';
  1171.     Access          := 500;
  1172.     UserNumber      := 0;
  1173.     Event           := 1400;
  1174.     ComPort         := 0;
  1175.     Baudrate        := 0;
  1176.     WhichIO         := InternalIO;
  1177.     IOinstalled     := FALSE;
  1178.     InBufSize       := 4096;
  1179.     OutBufSize      := 4096;
  1180.     IRQ             := 4;
  1181.     WordSize        := 8;
  1182.     Parity          := 'N';
  1183.     StopBits        := 1;
  1184.     Node            := 1;
  1185.     LocalInputON    := TRUE;
  1186.     UpdateStatusBar := TRUE;
  1187.     StatusBarY      := 25;
  1188.     LocalMaxY       := 25;
  1189.     MinutesLeft     := 1440;
  1190.     SecondsLeft     := MinutesLeft * LONGINT(60);
  1191.     IdleCount       := 0;
  1192.     UpdateSecs      := TRUE;
  1193.     UpdateIdle      := TRUE;
  1194.     LocalKey        := TRUE;
  1195.     OnLine          := TRUE;
  1196.   END;
  1197.   CurColor      := TextAttr;
  1198.   UFirst        := 'Joe';
  1199.   ULast         := 'User';
  1200.   BackSpaceChar := ' ';
  1201.   ErrLevel      := 0;
  1202.   LogPath       := FixPath(HomeDir);
  1203.   LogFile       := '';
  1204.   MiscFile      := '';
  1205.   DropFilePath  := '';
  1206.   s_ReadKey     := '';
  1207.   ProgramName   := 'No Program Name';
  1208.   ProgramDesc   := 'No Program Description';
  1209.   Copyright     := 'Copyright 1995-Current ■ Larry L. Athey ■ BBS Utiliteez Software';
  1210.   ClockOn;
  1211. END.
  1212.